package com.haojin.java;

import org.junit.Test;

import java.io.*;

/**
 * @author .29.
 * @create 2022-04-15 18:15
 */
/*
处理流之二：转换流的使用
1.转换流：属于字符流
  InputStreamReader 将字节的输入流转换为字符的输入流
  OutputSteamWriter 将一个字符的输出流转换为字节的输出流

2.作用：提供字节流与字符流之间的转换

3.解码：将字节、字节数组 --> 字符、字符数组
  编码：将字符、字符数组 --> 字节、字节数组

4.字符集
ASCII:美国标准信息交换码。
      用一个字节的7为可以表示
ISO8859-1:拉丁码表，欧洲码表
GB2312:中国的中文编码表，最多两个字节编码所有字符
GBK:中国的中文编码表升级，融合更多的中文文字符号，最多两个字节编码
Unicode：国际标准吗，融合了目前人类使用的所有字符，为每个字符分配唯一的字符码
UTF-8：变长的编码方式，可用1-4个字节来表示一个字符

 */
public class InputStreamReaderTest {
    @Test
    public void test() {
        InputStreamReader isr = null;
        OutputStreamWriter osw = null;
        try {
            FileInputStream fis = new FileInputStream("hi hi hi.txt");
//            isr = new InputStreamReader(fis);//使用系统默认的字符集
            //指明使用哪个字符集，具体使用那个字符集，取决于文件保存时使用的字符集
            isr = new InputStreamReader(fis,"utf-8");//使用UTF-8
            FileOutputStream fos = new FileOutputStream("hi1.txt");
            osw = new OutputStreamWriter(fos);
            char[] cbuf = new char[5];
            int len;
            while ((len = isr.read(cbuf)) != -1) {
//                osw.write(cbuf, 0, len);
                //输出到控制台
                String s = new String(cbuf, 0, len);
                System.out.print(s);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (isr != null) {
                try {
                    isr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (osw != null) {
                try {
                    osw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
